<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>面向对象与原型</title>
	</head>
	<body>
	</body>
	<script>
		//创建对象
		var box = new Object();//创建对象
		box.name='lee';//添加属性
		box.run =function(){  //添加方法
			return this.name+','+this.age+','+'正在运行中...';//this便是当前作用于域（box）的对象
		}
		var name ='window';
		alert(this.name);//this 此处代表window对象
		alert(box.run());//lee,undefined,正在运行中...
		
		
		
		//1工厂模式
		//缺点无法区分是哪个对象
		function creatObject(name,age){
			var obj = new Object();
			obj.name =name;
			obj.age =age;
			obj.run=function(){
				return this.name+','+this.age+','+'运行中...';
			};
			return obj;     //返回对象的引用
		};
		
		var box1 = creatObject('Tom',100);
		var box2 = creatObject('jack',200);
		
		alert(box1.run());
		alert(box2.run());
		
		
		
		//2构造函数
		//使用构造函数解决了重复实例化问题，又解决了对象识别问题
		function Box(name,age){//创建一个对象所有构造函数的对象其实就是Object
			this.name =name;
			this.age =age;
			this.run = function(){
			return this.name+','+this.age+','+'运行中...';
			};
		}
		//第二个构造函数（普通函数首字符无需大写）
			function Desk(name,age){//创建一个对象所有构造函数的对象其实就是Object
			this.name =name;
			this.age =age;
			this.run = function(){
			return this.name+','+this.age+','+'运行中...';
			};
		}
		//1构造函数没有new Object ，但是后台会自动var obj = new Object();
		//2 this 就相当于obj
		//3构造函数不需要返回对 象引用，它是后台自动返回的
		
		//1构造函数也是函数，但是函数名第一个字母大写
		//2必须new 构造函数名()，new Box(),而这个Box第一个字母也是大写的
		//3必须使用new 运算符
		var Box1 = new Box('小明',100);//实例化
		var Box2 = new Box('小红',120);//只要实例化地址不同
		var  desk = new Desk('桌子',200);
		alert(Box1.run());
		alert(Box2.run());
		alert(Box1 instanceof  Object);//true
		alert(Box2 instanceof Box);//true
		alert(desk instanceof Box);//false
		
		
		//对象冒充
		var o = new Object();
		Box.call(o,'lee',100);//对象冒充
		alert(o.run());
		
		
		//通过构造函数外面绑定同一个函数方法来保证引用地址的一致性（这么做没必要）
			function Desk(name,age){
			this.name =name;
			this.age =age;
			this.run = run;//
		}
		  function  run (){//但是可能被外面恶意直接调用
			return this.name+','+this.age+','+'运行中...';
			}	
			var desk1 = new Desk('lee',100);//实例化
			var desk2 = new  Desk('lee',100);
			alert(desk2.age==desk2.age);//true
			alert(desk1.run()==desk2.run());//true引用地址指向同一个地址
	</script>
	
</html>
